home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / gnu / progutil / stdwin.zoo / alfa / syswin.c < prev    next >
C/C++ Source or Header  |  1989-10-18  |  3KB  |  177 lines

  1. /* STDWIN -- SYTEM WINDOW. */
  2.  
  3. #include "alfa.h"
  4.  
  5. WINDOW *syswin;        /* Window id 0, the system window */
  6.             /* Global because wgetevent needs to know about
  7.                it, so it can suppress events belonging to
  8.                this window. */
  9.  
  10. static void
  11. helpmessage()
  12. {
  13.     char buf[256];
  14.     char shortcut[256];
  15.     
  16.     getbindings(shortcut, 0, MENU_CALL);
  17.     sprintf(buf, "[Use  %s  to get a menu of commands]", shortcut);
  18.     wmessage(buf);
  19. }
  20.  
  21. void
  22. initsyswin()
  23. {
  24.     syswin= wopen("System", wsysdraw);
  25.     helpmessage();
  26. }
  27.  
  28. char *sysmsg;        /* Message to be drawn at (0, 0) */
  29. TEXTEDIT *syste;    /* Textedit record to be drawn, too */
  30.  
  31. /*ARGSUSED*/
  32. static void
  33. wsysdraw(win, left, top, right, bottom)
  34.     WINDOW *win;
  35.     int left, top;
  36.     int right, bottom;
  37. {
  38.     if (sysmsg != NULL) {
  39.         (void) wdrawtext(0, 0, sysmsg, -1);
  40.         if (syste != NULL)
  41.             tedraw(syste);
  42.     }
  43.     else
  44.         drawmenubar();
  45. }
  46.  
  47. void
  48. menubarchanged()
  49. {
  50.     uptodate[0]= FALSE;
  51. }
  52.  
  53. /* Print a message in the system window.
  54.    If the message is non-null, the screen is updated immediately. */
  55.  
  56. void
  57. wmessage(str)
  58.     char *str;
  59. {
  60.     if (sysmsg != NULL)
  61.         free(sysmsg);
  62.     sysmsg= strdup(str);
  63.     if (syste != NULL) {
  64.         tefree(syste);
  65.         syste= NULL;
  66.     }
  67.     wchange(syswin, 0, 0, 9999, 9999);
  68.     wnocaret(syswin);
  69.     if (str != NULL) {
  70.         wupdate(syswin);
  71.         wflush();
  72.     }
  73. }
  74.  
  75. /* Ask for an input string. */
  76.  
  77. bool
  78. waskstr(prompt, buf, len)
  79.     char *prompt;
  80.     char *buf;
  81.     int len;
  82. {
  83.     WINDOW *savewin= front;
  84.     WINDOW *win= syswin;
  85.     bool ok= FALSE;
  86.     bool stop= FALSE;
  87.     int teleft;
  88.     
  89.     wsetactive(win);
  90.     wmessage((char *) NULL);
  91.     sysmsg= prompt;
  92.     teleft= wtextwidth(prompt, -1) + wtextwidth(" ", 1);
  93.     if (teleft > columns * 3/4)
  94.         teleft= columns * 3/4;
  95.     syste= tealloc(syswin, teleft, 0, columns-teleft);
  96.     tereplace(syste, buf);
  97.     tesetfocus(syste, 0, 9999);
  98.     do {
  99.         EVENT e;
  100.         
  101.         if (!wsysevent(&e, FALSE)) {
  102.             wupdate(syswin);
  103.             wflush();
  104.             wsysevent(&e, TRUE);
  105.         }
  106.         e.window= syswin; /* Not filled in by wsys*event();
  107.                      needed by teevent(). */
  108.             
  109.         switch (e.type) {
  110.         
  111.         case WE_MENU:
  112.             if (e.u.m.id != 0) {
  113.                 wfleep();
  114.                 break;
  115.             }
  116.             switch (e.u.m.item) {
  117.             
  118.             case SUSPEND_PROC:
  119.                 _wsuspend();
  120.                 break;
  121.             
  122.             case REDRAW_SCREEN:
  123.                 _wredraw();
  124.                 break;
  125.             
  126.             case LITERAL_NEXT:
  127.                 _wlitnext(&e);
  128.                 goto char_case;
  129.             
  130.             default:
  131.                 if (e.u.m.item >= FIRST_CMD &&
  132.                     e.u.m.item <= LAST_CMD)
  133.                     wsyscommand(&e);
  134.                 break;
  135.             }
  136.             if (e.type != WE_COMMAND)
  137.                 break;
  138.         
  139.         /* Fall through from previous case! */
  140.         case WE_COMMAND:
  141.             switch (e.u.command) {
  142.             
  143.             case WC_RETURN:
  144.             case WC_CANCEL:
  145.                 ok= e.u.command == WC_RETURN;
  146.                 stop= TRUE;
  147.                 break;
  148.             
  149.             default:
  150.                 if (!teevent(syste, &e))
  151.                     wfleep();
  152.                 break;
  153.             
  154.             }
  155.             break;
  156.         
  157.         char_case: /* Jump here from LITERAL_NEXT menu case */
  158.         case WE_CHAR:
  159.         case WE_MOUSE_DOWN:
  160.         case WE_MOUSE_MOVE:
  161.         case WE_MOUSE_UP:
  162.             if (!teevent(syste, &e))
  163.                 wfleep();
  164.             break;
  165.         
  166.         }
  167.     } while (!stop);
  168.     if (ok) {
  169.         strncpy(buf, tegettext(syste), (size_t)len);
  170.         buf[len-1]= EOS;
  171.     }
  172.     sysmsg= NULL;
  173.     wmessage((char *) NULL);
  174.     wsetactive(savewin);
  175.     return ok;
  176. }
  177.